/*
    Copyright (C) 2013 maik.jablonski@jease.org

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package jfix.db4o;

import java.io.File;
import java.util.UUID;

import jfix.util.Files;

/**
 * Persistent class which can be used to store binary content directly in
 * file-system. You can get access to the file by calling #getFile().
 * 
 * Initially the blob is stored in #JAVA_IO_TMPDIR. When the blob is persisted
 * in database for the first time, the file will be moved to a directory
 * dependent on the database by calling #initPath().
 */
public class Blob extends Persistent implements Persistent.Value {

	protected static transient String JAVA_IO_TMPDIR = System
			.getProperty("java.io.tmpdir") + File.separator;

	protected transient String path;
	protected final String id = UUID.randomUUID().toString();

	public String getId() {
		return id;
	}

	public File getFile() {
		return new File(path != null ? path : (JAVA_IO_TMPDIR + id));
	}

	public String toString() {
		return id;
	}

	protected void initPath(String blobDirectory) {
		if (path == null) {
			StringBuilder sb = new StringBuilder();
			sb.append(blobDirectory).append("blob").append(File.separator);
			sb.append(id.substring(0, 2)).append(File.separator);
			sb.append(id.substring(2, 4)).append(File.separator);
			new File(sb.toString()).mkdirs();
			File source = getFile();
			path = sb.append(id).toString();
			File target = getFile();
			if (source.exists() && !target.exists()) {
				Files.rename(source, target);
			}
		}
	}

}
